package com.raising.utils;

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.*;

/**
 * 线程处理工具
 *
 * Java通过Executors提供四种线程池，分别为：
 newCachedThreadPool创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。
 newFixedThreadPool 创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。
 newScheduledThreadPool 创建一个定长线程池，支持定时及周期性任务执行。
 newSingleThreadExecutor 创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
 * 
 * @author gaoy
 */
public class JThreadUtils extends BaseUtils {

//	/**
//	 * 单线程执行器
//	 * 创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。
//	 */
//	public static ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
//
//	/**
//	 * 动态多线程执行器
//	 * 创建一个单线程化的线程池，它只会用唯一的工作线程来执行任务，保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
//	 * use : 见main方法
//	 */
//	public static ExecutorService executor = Executors.newCachedThreadPool();
//
//	/**
//	 * sleep等待,单位为毫秒 忽略InterruptedException.
//	 */
//	public static void sleep(long millis) {
//		try {
//			Thread.sleep(millis);
//		} catch (InterruptedException e) {
//			logger.error(e.getMessage(), e);
//		}
//	}
//
//	public static void main(String[] args){
//		JThreadUtils.executor.execute(new Runnable() {
//			@Override
//			public void run() {
//
//			}
//		});
//	}

	private static ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build();

	/**
	 * corePoolSize 线程基准数量（线程低于最低，无论如何都会创建新的线程  ）
	 * maximumPoolSize 最大线程数（线程数量达到最大时，放入队列排队）
	 *
	 * @author GaoYuan
	 * @date 2018/5/25 下午12:39
	 */
	public static ExecutorService pool = new ThreadPoolExecutor(20,200,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024),threadFactory,new ThreadPoolExecutor.AbortPolicy());

	public static void main(String[] args){
		int i = 500;
		while (i>0){
			pool.execute(new Runnable(){
				@Override
				public void run() {
					try {
						Thread.sleep(500);
					}catch (Exception e){
					}
					System.out.println(Thread.currentThread().getName());
				}
			});
			i--;
		}
	}

}
